# -*- coding: utf-8 -*-
"""
File: logger.py
Author: StellaJL
Date: 2025-09-16 01-42-04
Version：1.0.0
Description: 日志模块，提供统一的日志记录功能
"""

import logging
import os
from datetime import datetime
import sys


class SpiderLogger:
    """爬虫日志记录器类"""
    
    def __init__(self, name: str = 'spider', log_level: str = 'INFO', log_dir: str = 'logs') -> None:
        """
        初始化日志记录器
        
        Args:
            name: 日志记录器名称
            log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
            log_dir: 日志文件存储目录
        """
        self.name = name
        self.log_level = getattr(logging, log_level.upper(), logging.INFO)
        self.log_dir = log_dir
        
        # 创建日志目录
        os.makedirs(self.log_dir, exist_ok=True)
        
        # 创建日志记录器
        self.logger = logging.getLogger(name)
        self.logger.setLevel(self.log_level)
        
        # 避免重复添加处理器
        if not self.logger.handlers:
            self._setup_handlers()
    
    def _setup_handlers(self):
        """设置日志处理器"""
        # 文件处理器 - 按日期命名
        today = datetime.now().strftime('%Y-%m-%d')
        log_file = os.path.join(self.log_dir, f'spider_{today}.log')
        
        file_handler = logging.FileHandler(log_file, encoding='utf-8')
        file_handler.setLevel(self.log_level)
        
        # 控制台处理器
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(self.log_level)
        
        # 设置日志格式
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        
        # 添加处理器到日志记录器
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)
    
    def debug(self, message: str, *args, **kwargs):
        """记录DEBUG级别日志"""
        self.logger.debug(message, *args, **kwargs)
    
    def info(self, message: str, *args, **kwargs):
        """记录INFO级别日志"""
        self.logger.info(message, *args, **kwargs)
    
    def warning(self, message: str, *args, **kwargs):
        """记录WARNING级别日志"""
        self.logger.warning(message, *args, **kwargs)
    
    def error(self, message: str, *args, **kwargs):
        """记录ERROR级别日志"""
        self.logger.error(message, *args, **kwargs)
    
    def critical(self, message: str, *args, **kwargs):
        """记录CRITICAL级别日志"""
        self.logger.critical(message, *args, **kwargs)
    
    def exception(self, message: str, *args, **kwargs):
        """记录异常信息（包含堆栈跟踪）"""
        self.logger.exception(message, *args, **kwargs)
    
    def isEnabledFor(self, level: int) -> bool:
        """检查是否启用了指定级别的日志记录"""
        return self.logger.isEnabledFor(level)


# 全局日志记录器实例
def get_logger(name: str = 'spider', log_level: str = 'INFO', log_dir: str = 'logs') -> SpiderLogger:
    """
    获取日志记录器实例
    
    Args:
        name: 日志记录器名称
        log_level: 日志级别
        
    Returns:
        SpiderLogger: 日志记录器实例
    """
    return SpiderLogger(name, log_level, log_dir)


# 便捷函数
def setup_logging(log_level: str = 'INFO', log_dir: str = 'logs') -> SpiderLogger:
    """
    设置全局日志配置
    
    Args:
        log_level: 日志级别
        log_dir: 日志目录
        
    Returns:
        SpiderLogger: 配置好的日志记录器
    """
    return get_logger('spider', log_level, log_dir)


# 默认日志记录器
default_logger = get_logger()
